home *** CD-ROM | disk | FTP | other *** search
- /* Copyright (c) 1990,1991,1992 Chris and John Downey */
- #ifndef lint
- static char *sccsid = "@(#)ptrfunc.c 2.2 (Chris & John Downey) 8/28/92";
- #endif
-
- /***
-
- * program name:
- xvi
- * function:
- PD version of UNIX "vi" editor, with extensions.
- * module name:
- ptrfunc.c
- * module function:
- Primitive functions on "Posn"s.
- * history:
- STEVIE - ST Editor for VI Enthusiasts, Version 3.10
- Originally by Tim Thompson (twitch!tjt)
- Extensive modifications by Tony Andrews (onecom!wldrdg!tony)
- Heavily modified by Chris & John Downey
-
- ***/
-
- #include "xvi.h"
-
- /*
- * The routines in this file attempt to imitate many of the operations
- * that used to be performed on simple character pointers and are now
- * performed on Posn's. This makes it easier to modify other sections
- * of the code. Think of a Posn as representing a position in the file.
- * Posns can be incremented, decremented, compared, etc. through the
- * functions implemented here.
- *
- * Note that some functions are now implemented as macros, in ptrfunc.h.
- */
-
- /*
- * inc(p)
- *
- * Increment the line pointer 'p' crossing line boundaries as
- * necessary. Return mv_CHLINE when crossing a line, mv_NOMOVE when at
- * end of file, mv_SAMELINE otherwise.
- */
- enum mvtype
- inc(lp)
- register Posn *lp;
- {
- register char *p;
-
- p = &(lp->p_line->l_text[lp->p_index]);
-
- if (*p != '\0') { /* still within line */
- lp->p_index++;
- return((p[1] != '\0') ? mv_SAMELINE : mv_EOL);
- }
-
- if (!is_lastline(lp->p_line->l_next)) {
- lp->p_index = 0;
- lp->p_line = lp->p_line->l_next;
- return(mv_CHLINE);
- }
-
- return(mv_NOMOVE);
- }
-
- /*
- * dec(p)
- *
- * Decrement the line pointer 'p' crossing line boundaries as
- * necessary. Return mv_CHLINE when crossing a line, mv_NOMOVE when at
- * start of file, mv_SAMELINE otherwise.
- */
- enum mvtype
- dec(lp)
- register Posn *lp;
- {
- if (lp->p_index > 0) { /* still within line */
- lp->p_index--;
- return(mv_SAMELINE);
- }
-
- if (!is_line0(lp->p_line->l_prev)) {
- lp->p_line = lp->p_line->l_prev;
- lp->p_index = strlen(lp->p_line->l_text);
- return(mv_CHLINE);
- }
-
- return(mv_NOMOVE); /* at start of file */
- }
-
- /*
- * pswap(a, b) - swap two position pointers.
- */
- void
- pswap(a, b)
- register Posn *a, *b;
- {
- register Posn tmp;
-
- tmp = *a;
- *a = *b;
- *b = tmp;
- }
-
- /*
- * Posn comparisons.
- */
- bool_t
- lt(a, b)
- register Posn *a, *b;
- {
- if (a->p_line != b->p_line) {
- return(earlier(a->p_line, b->p_line));
- } else {
- return(a->p_index < b->p_index);
- }
- }
-